#ifndef INDICE_H_
#define INDICE_H_

#include <string>
#include <fstream>
#include <list>
#include "Archivo.h"
#include "Almacenamiento.h"
#include "Compuesto.h"

using namespace std;

class EstrategiaIndice;

//Clase para implementar un indice.
class Indice: public Archivo{
	public:
		Indice(string nombreArchivo, EstrategiaIndice* e, EstrategiaAlmacenamiento* a, int longBloque, int longitudBloqueIndice);
		void indexar(list<string> key, int offset); //Indexa un registro nuevo que se guardo
		int buscar(list<string> key); //Busca un registro, devuelve el offset sino lo encuentra devuelve null
		void eliminar(list<string> key);
		void imprimir();

		int getLongBloque();

		//el nombre de archivo puede o no estar. Hay que verlo
		//falta un imprimir secuencial ver como se hace
		//hay que crear un archivo de indices (para B# y hashing) y en mi caso uno + para almacenar una tabla
	    //estoy viendo cuando crearlos seria en principio si tiene indice crear los archivos con el mismo
		//nombre de que tiene el archivo de datos + un identificador
	private:
		EstrategiaIndice* estrategiaInd;
		int longitudBloque;
		string nombreArchivo;
};

class EstrategiaIndice{
	public:
	virtual void indexar(Indice* indice, list<string> key, int offset) = 0;
	virtual int buscar(Indice* indice, list<string> key) = 0;
	virtual int eliminar(Indice* indice, list<string> key) = 0;
};

class NoIndexado: public EstrategiaIndice{
	public:
	//No hay indexado ni eliminacion. Solo busqueda.
	int buscar(Indice* indice, list<string> key);
	void indexar(Indice* indice, list<string> key, int offset);
	int eliminar(Indice* indice, list<string> key);
};

class IndexadoBSharp: public EstrategiaIndice{
	public:
		void indexar(Indice* indice, list<string> key, int offset);
		int buscar(Indice* indice, list<string> key);
		int eliminar(Indice* indice, list<string> key);
	private:
		int tamanoNodo;
};

class IndexadoHashExtensible: public EstrategiaIndice{
	public:
	void indexar(Indice* indice, list<string> key, int offset);
	int buscar(Indice* indice, list<string> key);
	int eliminar(Indice* indice, list<string> key);
	private:
		int tamanoBloque;
};

#endif /*INDICE_H_*/
